<?php

require_once('bdd/DAOMot.php');
require_once('modele/Mot.php');

define('NB_COUP_PERDANT', 6);

$idSession = @$_REQUEST['session'];
$action = @$_REQUEST['action'];
$cheat = @$_REQUEST['cheat'];

if (isset($_REQUEST['session'])) {
    $idSession = session_id($idSession);
}

session_start();

//on test l'action demandée par le client
switch ($action) {
    case "commencer"://Le jeu demarre
        try {
            //$_SESSION = "";
            session_destroy();
            session_start();
            $_SESSION["tour"] = 0;
            $_SESSION["coupsPerdant"] = 0;
            generer();
            $ok = decouverte("");
            $_SESSION["tour"]++;
            repondre($idSession, $cheat, $ok);
        } catch (Exception $e) {
            noComprendo($e->getMessage());
        }
        break;
    case "jouer"://un coup est joué par le l'utilisateur
        $_SESSION["tour"]++;
        $ok = decouverte(@$_REQUEST['lettre']);
        repondre($idSession, $cheat, $ok);
        break;
    default:
        noComprendo("Requête invalide !");
        break;
}

/**
 *
 * @param type $lettre lettre a decouvrir dans les mot FR et EN
 * @return 1   -> La lettre n'est pas dans le mot
 *         2   -> La partie est perdu
 *         A-Z -> Lettre decouverte
 */
function decouverte($lettre) {
    $lettrePresente = FALSE;
    $ok = 0;
    $oMot = unserialize($_SESSION["mot"]);
    $longueurFr = strlen($oMot->getFr());
    $longueurEn = strlen($oMot->getEn());
    if (($lettre == "") && ($_SESSION["tour"] == 0)) {
        $_SESSION["motFrDecouvert"] = "";
        $_SESSION["motEnDecouvert"] = "";
        $motFr = $oMot->getFr();
        for ($i = 0; $i < $longueurFr; $i++) {
            if ("-" == $motFr[$i])
                $_SESSION["motFrDecouvert"].="-";
            else if (" " == $motFr[$i])
                $_SESSION["motFrDecouvert"].=" ";
            else
                $_SESSION["motFrDecouvert"].="_";
        }
        $motEn = $oMot->getEn();
        for ($i = 0; $i < $longueurEn; $i++) {
            if ("-" == $motEn[$i])
                $_SESSION["motEnDecouvert"].="-";
            else if (" " == $motEn[$i])
                $_SESSION["motEnDecouvert"].=" ";
            else
                $_SESSION["motEnDecouvert"].="_";
        }
    } else {
        $motFr = $oMot->getFr();
        for ($i = 0; $i < $longueurFr; $i++) {
            if ($lettre == $motFr[$i] || strtolower($lettre) == $motFr[$i]) {
                $_SESSION["motFrDecouvert"][$i] = $lettre;
                $ok = $lettre;
                $lettrePresente = TRUE;
            }
        }
        $motEn = $oMot->getEn();
        for ($i = 0; $i < $longueurEn; $i++) {
            if ($lettre == $motEn[$i] || strtolower($lettre) == $motEn[$i]) {
                $_SESSION["motEnDecouvert"][$i] = $lettre;
                $ok = $lettre;
                $lettrePresente = TRUE;
            }
        }
        if (($oMot->getFr() == $_SESSION["motFrDecouvert"]
                && $oMot->getEn() == $_SESSION["motEnDecouvert"])
                || ($oMot->getFr() == strtolower($_SESSION["motFrDecouvert"])
                        && $oMot->getEn() == strtolower($_SESSION["motEnDecouvert"])))
            $ok = 1;
        if ($lettrePresente == FALSE) {
            $_SESSION["coupsPerdant"]++;
        }
        if ($_SESSION["coupsPerdant"] >= NB_COUP_PERDANT) {
            $ok = 2;
        }
    }
    return $ok;
}

/**
 * Construit la reponse et la renvoi client
 * @param type $idSession id de la session en cour
 * @param type $cheat TRUE          -> la triche est activée
 *                    FALSE         -> la triche est desactivée
 * @param type $ok Etat du jeu  0 rien trouvé
 *                               A-Z la lettre est trouvée
 *                               1 Le joueur a gagné
 *                               2 Le joueur a perdu
 */
function repondre($idSession, $cheat, $ok) {
    $oMot = unserialize($_SESSION["mot"]);
    $retour = "";
    $retour.=$ok;
    $retour.="#";
    $retour.=session_id();
    $retour.="#";
    $retour.=$_SESSION["tour"];
    $retour.="#";
    $retour.=$_SESSION["coupsPerdant"];
    $retour.="#";
    $retour.=$_SESSION["motFrDecouvert"];
    $retour.="#";
    $retour.=$_SESSION["motEnDecouvert"];
    if ($cheat || $ok == 2) {
        $retour.="#";
        $retour.=$oMot->getFr();
        $retour.="#";
        $retour.=$oMot->getEn();
    }

    print $retour;
}

/**
 * Renvoie au client le message passé en parametre.
 * @param type $message Le message a renvoyer
 */
function noComprendo($message) {
    print $message;
}

/**
 * Recupere un mot aleatoire dans la base de données
 * Une exception est lancée si erreur SQL
 * @return true si un objet mot est serialisé en SESSION
 */
function generer() {
    try {
        //Mot aléatoire pour le jeu du pendu
        $oDAOMot = new DAOMot();
        $oMot = NULL;
        $oMot = $oDAOMot->getMot();

        if ($oMot != NULL) {
            $_SESSION["mot"] = serialize($oMot);
        }

        return TRUE;
    } catch (Exception $e) {
        throw new Exception($e->getMessage());
    }
}

?>